#ifndef LEXICAL_ANALYSER_H_
#define LEXICAL_ANALYSER_H_

// Usado para definir o include apenas uma vez
#if ! defined(yyFlexLexerOnce)
#include <FlexLexer.h>
#endif

#undef YY_DECL
#define YY_DECL int Scanner::yylex()

// Inclui os tokens do analisador sintático
#include "Parser.tab.h"

#include "ErrorPrinter.h"
#include "ReservedTable.h"

namespace LALG
{

/*
 * =====================================================================================
 *        Class:  Scanner
 *  Description:  Classe que representa o analisador léxico do compilador
 * =====================================================================================
 */
class Scanner: yyFlexLexer
{

public:

    /*-----------------------------------------------------------------------------
     *  Contrói um analisador léxico passando um driver
     *-----------------------------------------------------------------------------*/
    Scanner(Driver& driver);

    /*-----------------------------------------------------------------------------
     *  Função de scaneamento com valor semântico
     *-----------------------------------------------------------------------------*/
    int yylex(Parser::semantic_type* lval);

    /*-----------------------------------------------------------------------------
     *  Retorna o número de linhas correntes
     *-----------------------------------------------------------------------------*/
    int getLineno()
    {
        return lineno();
    }

    /*-----------------------------------------------------------------------------
     *  Retorna último token lido
     *-----------------------------------------------------------------------------*/
    string getToken()
    {
        return yytext;
    }

private:

    /*-----------------------------------------------------------------------------
     *  Função de scaneamento criado pelo Flex
     *-----------------------------------------------------------------------------*/
    int yylex();

    /*-----------------------------------------------------------------------------
     *  Verifica o tipo do identificador reconhecido
     *-----------------------------------------------------------------------------*/
    int checkID();

    /*-----------------------------------------------------------------------------
     *  Imprime um erro
     *-----------------------------------------------------------------------------*/
    void printError(ErrorWhat what);

    /*-----------------------------------------------------------------------------
     *  Valor semântico
     *-----------------------------------------------------------------------------*/
    Parser::semantic_type* yylval;

    /*-----------------------------------------------------------------------------
     *  Driver
     *-----------------------------------------------------------------------------*/
    Driver& driver;

};

}

#endif /* TOKENIZER_H_ */
